package com.peakmain.wanandroid.netmodule.net.http.callback;


import com.peakmain.wanandroid.netmodule.net.http.ResponseCode;
import com.peakmain.wanandroid.netmodule.net.http.util.ClassTypeReflect;

import java.lang.reflect.Type;

import okhttp3.Response;

/**
 * author ：Peakmain
 * version : 1.0
 * createTime：2020/2/22
 * mail:2726449200@qq.com
 * describe：请求回调
 */
public abstract class RequestCallBack<T> {

    public Type type;

    public RequestCallBack() {
        type = ClassTypeReflect.getModelClazz(getClass());
    }

    /**
     * 请求网络开始前，UI线程
     *
     * @param id 请求唯一标识id
     */
    public void onBefore(int id) {
    }


    /**
     * 拿到响应后，将数据转换成需要的格式，子线程中执行，可以是耗时操作
     *
     * @param responseCode 请求code值
     * @param response     请求成功后返回 response
     */
    public abstract T parseNetworkResponse(ResponseCode responseCode, Response response) throws Exception;

    /**
     * 对返回数据进行操作的回调， UI线程
     *
     * @param t            解析后实体类
     * @param responseCode 请求处理code
     * @param id           请求唯一标识id
     */
    public abstract void onSuccess(T t, ResponseCode responseCode, int id);

    /**
     * 接口请求失败(http请求成功的,处理业务层)
     *
     * @param responseCode 错误码和错误相关信息
     * @param id           请求唯一标识id
     */
    public abstract void onFailure(ResponseCode responseCode, int id);

    /**
     * 响应错误，数据解析错误等，都会回调该方法， UI线程
     *
     * @param responseCode 错误码和错误相关信息
     * @param e            异常信息
     * @param id           请求唯一标识id
     */
    public void onError(ResponseCode responseCode, Exception e, int id) {

    }

    /**
     * 请求网络结束后，UI线程
     *
     * @param id 请求唯一标识id
     */
    public void onAfter(int id) {

    }

    /**
     * 上传文件进度
     *
     * @param progress
     */
    public void onProgress(int progress) {

    }

}
